המכללה האקדמית של ת"א-יפו בית הספר למדעי המחשב מבוא למדעי המחשב בשפת C: חוברת תרגילים

Σχετικά έγγραφα
חורף תש''ע פתרון בחינה סופית מועד א'

פתרון תרגיל מרחבים וקטורים. x = s t ולכן. ur uur נסמן, ur uur לכן U הוא. ur uur. ur uur

תרגול פעולות מומצאות 3

שדות תזכורת: פולינום ממעלה 2 או 3 מעל שדה הוא פריק אם ורק אם יש לו שורש בשדה. שקיימים 5 מספרים שלמים שונים , ראשוני. שעבורם

סדרות - תרגילים הכנה לבגרות 5 יח"ל

פתרון תרגיל 8. מרחבים וקטורים פרישה, תלות \ אי-תלות לינארית, בסיס ומימד ... ( ) ( ) ( ) = L. uuruuruur. { v,v,v ( ) ( ) ( ) ( )

= 2. + sin(240 ) = = 3 ( tan(α) = 5 2 = sin(α) = sin(α) = 5. os(α) = + c ot(α) = π)) sin( 60 ) sin( 60 ) sin(

צעד ראשון להצטיינות מבוא: קבוצות מיוחדות של מספרים ממשיים

ל הזכויות שמורות לדפנה וסטרייך

חידה לחימום. כתבו תכappleית מחשב, המקבלת כקלט את M ו- N, מחליטה האם ברצוappleה להיות השחקן הפותח או השחקן השappleי, ותשחק כך שהיא תappleצח תמיד.

לדוגמה: במפורט: x C. ,a,7 ו- 13. כלומר בקיצור

תרגול 8: מטלאב לולאות

סיכום- בעיות מינימוםמקסימום - שאלון 806

3-9 - a < x < a, a < x < a

תרגיל 13 משפטי רול ולגראנז הערות

משוואות רקורסיביות רקורסיה זו משוואה או אי שוויון אשר מתארת פונקציה בעזרת ערכי הפונקציה על ארגומנטים קטנים. למשל: יונתן יניב, דוד וייץ

פתרון תרגיל 5 מבוא ללוגיקה ותורת הקבוצות, סתיו תשע"ד

תשובות מלאות לבחינת הבגרות במתמטיקה מועד ג' תשע"ד, מיום 0/8/0610 שאלונים: 315, מוצע על ידי בית הספר לבגרות ולפסיכומטרי של אבירם פלדמן

גבול ורציפות של פונקציה סקלרית שאלות נוספות

מתמטיקה בדידה תרגול מס' 12

תרגול 1 חזרה טורי פורייה והתמרות אינטגרליות חורף תשע"ב זהויות טריגונומטריות

השאלות..h(k) = k mod m

I. גבולות. x 0. מתקיים L < ε. lim אם ורק אם. ( x) = 1. lim = 1. lim. x x ( ) הפונקציה נגזרות Δ 0. x Δx

תרגול מס' 6 פתרון מערכת משוואות ליניארית

( )( ) ( ) f : B C היא פונקציה חח"ע ועל מכיוון שהיא מוגדרת ע"י. מכיוון ש f היא פונקציהאז )) 2 ( ( = ) ( ( )) היא פונקציה חח"ע אז ועל פי הגדרת

שאלה 1 V AB פתרון AB 30 R3 20 R

[ ] Observability, Controllability תרגול 6. ( t) t t קונטרולבילית H למימדים!!) והאובז' דוגמא: x. נשתמש בעובדה ש ) SS rank( S) = rank( עבור מטריצה m

תרגיל 7 פונקציות טריגונומטריות הערות

gcd 24,15 = 3 3 =

סיכום חקירת משוואות מהמעלה הראשונה ומהמעלה השנייה פרק זה הינו חלק מסיכום כולל לשאלון 005 שנכתב על-ידי מאיר בכור

מבני נתונים ואלגוריתמים תרגול #11

פתרונות , כך שאי השוויון המבוקש הוא ברור מאליו ולכן גם קודמו תקף ובכך מוכחת המונוטוניות העולה של הסדרה הנתונה.

יסודות לוגיקה ותורת הקבוצות למערכות מידע (סמסטר ב 2012)

{ : Halts on every input}

אוטומט סופי דטרמיניסטי מוגדר ע"י החמישייה:

דף פתרונות 7 נושא: תחשיב הפסוקים: צורה דיסיונקטיבית נורמלית, מערכת קשרים שלמה, עקביות

לוגיקה ותורת הקבוצות פתרון תרגיל בית 8 חורף תשע"ו ( ) ... חלק ראשון: שאלות שאינן להגשה נפריד למקרים:

אוסף שאלות מס. 3 פתרונות

תוכן הפרק: ,best case, average case דוגמאות 1. זמן - נמדד באמצעות מס' פעולות סיבוכיות, דוגמאות, שיפור בפקטור קבוע האלגוריתם. וגודלם. איטרטיביים. לקלט.

Logic and Set Theory for Comp. Sci.

תורת הגרפים - סימונים

s ק"מ קמ"ש מ - A A מ - מ - 5 p vp v=

מצולעים מצולעהוא צורה דו ממדית,עשויה קו"שבור"סגור. לדוגמה: משולש, מרובע, מחומש, משושה וכו'. לדוגמה:בסרטוט שלפappleיכם EC אלכסוןבמצולע.

מבני נתונים מבחן מועד ב' סמסטר חורף תשס"ו

משפטי בקרה ולולאות שעור מס. 3 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל

מבני בקרה ב C שעור מס. 2 דר' דרור טובי, המרכז האוניברסיטאי אריאל בשומרון.

x a x n D f (iii) x n a ,Cauchy

מתמטיקה בדידה תרגול מס' 5

מבני נתונים מדעי המחשב שאלון: מועד ב' תשע"ו מדעי המחשב פתרון בחינת הבגרות. Java שאלה 1. blog.csit.org.

אלגוריתמים ללכסון מטריצות ואופרטורים

תרגילים באמצעות Q. תרגיל 2 CD,BF,AE הם גבהים במשולש .ABC הקטעים. ABC D נמצאת על המעגל בין A ל- C כך ש-. AD BF ABC FME

סיכום בנושא של דיפרנציאביליות ונגזרות כיווניות

קיום ויחידות פתרונות למשוואות דיפרנציאליות

תכנות מתקדם בשפת C חוברת תרגילים - 1 -

אלגברה מודרנית פתרון שיעורי בית 6

אלגברה לינארית (1) - פתרון תרגיל 11

הגדרה: מצבים k -בני-הפרדה

הגדרה: קבוצת פעילויות חוקית היא קבוצה בה כל שתי פעילויות

בחינה בסיבוכיות עמר ברקמן, ישי חביב מדבקית ברקוד

קבוצה היא שם כללי לתיאור אוסף כלשהו של איברים.

חישוביות הרצאה 4 לא! זיהוי שפות ע''י מכונות טיורינג הוכחה: הגדרת! : f r

רשימת משפטים והגדרות

מתכנס בהחלט אם n n=1 a. k=m. k=m a k n n שקטן מאפסילון. אם קח, ניקח את ה- N שאנחנו. sin 2n מתכנס משום ש- n=1 n. ( 1) n 1

ניתוח סיבוכיות - פונקציות רקורסיביות פיתוח טלסקופי

תכנון אלגוריתמים 2016 עבודה 1 שאלה 1 פתרון נתונות שתי בעיות. יש למצוא: אורך מסלול קצר ביותר המתחיל באחד מן הקודקודים s 1,..., s k ומסתיים ב t.

לוגיקה ותורת הקבוצות פתרון תרגיל בית 4 אביב תשע"ו (2016)

(2) מיונים השאלות. .0 left right n 1. void Sort(int A[], int left, int right) { int p;

תכנות בשפת C פרק שלישי: בקרת זרימה שייקה בילו יועץ ומרצה בכיר למדעי המחשב וטכנולוגית מידע מומחה למערכות מידע חינוכיות, אקדמיות ומנהליות

TECHNION Israel Institute of Technology, Faculty of Mechanical Engineering מבוא לבקרה (034040) גליון תרגילי בית מס 5 ציור 1: דיאגרמת הבלוקים

אלגברה ליניארית (1) - תרגיל 6

TECHNION - ISRAEL INSTITUTE OF TECHNOLOGY DEPARTMENT OF COMPUTER SCIENCE סמסטר אביב תשס"ו מס' סטודנט:

brookal/logic.html לוגיקה מתמטית תרגיל אלון ברוק

2 יח"ל ) השלמה ל - 5 יח"ל) (50 נקודות) מעבר חוקי, ו-'שקר' אחרת.

טריגונומטריה הגדרות הפונקציות הטריגונומטריות הבסיסיות

אלגברה לינארית מטריצות מטריצות הפיכות

ניהול תמיכה מערכות שלבים: DFfactor=a-1 DFt=an-1 DFeror=a(n-1) (סכום _ הנתונים ( (מספר _ חזרות ( (מספר _ רמות ( (סכום _ ריבועי _ כל _ הנתונים (

Charles Augustin COULOMB ( ) קולון חוק = K F E המרחק סטט-קולון.

co ארזים 3 במרץ 2016

לולאות קבוע, פסוק while פסוק do-while פסוק for

סימני התחלקות ב 3, ב 6 וב 9

(ספר לימוד שאלון )

אינפי - 1 תרגול בינואר 2012

אלגברה ליניארית 1 א' פתרון 2

מבחן מועד ב' בהצלחה! אנא קיראו היטב את ההוראות שלהלן: ודאו כי כל עמודי הבחינה נמצאים בידכם.

מבני נתונים מבחן מועד א' סמסטר חורף תשס"ו

אלגוריתמים 1, סמסטר אביב 2017

"קשר-חם" : לקידום שיפור וריענון החינוך המתמטי

Domain Relational Calculus דוגמאות. {<bn> dn(<dn, bn> likes dn = Yossi )}

התפלגות χ: Analyze. Non parametric test

1 תוחלת מותנה. c ארזים 3 במאי G מדיד לפי Y.1 E (X1 A ) = E (Y 1 A )

פרק 13 רקורסיה רקורסיה רקורסיה רקורסיות פשוטות: חישוב עצרת. תמונת המחסנית ב-() factorial רקורסיות פשוטות: פיבונאצ'י

תאריך הבחינה: שם המרצה: רפי כהן שם המתרגל: יסודות מבני נתונים שם הקורס:

מודלים חישוביים תרגולמס 7

. {e M: x e} מתקיים = 1 x X Y

מבני נתונים ויעילות אלגוריתמים

תורת הקבוצות תרגיל בית 2 פתרונות

C תפשב םדקתמ תונכת םיליגרת תרבוח - - 1

תורת המספרים 1 פירוק לגורמים ראשוניים סיכום הגדרות טענות ומשפטים אביב הגדרות 1.2 טענות

תכנון דינאמי. , p p p והמטריצה המתקבלת היא בגודל

-107- גיאומטריה זוויות מבוא מטרתנו בפרק זה היא לחזור על המושגים שנלמדו ולהעמיק את הלימוד בנושא זה.

Transcript:

המכללה האקדמית של ת"א-יפו בית הספר למדעי המחשב מבוא למדעי המחשב בשפת C: חוברת תרגילים כל הזכויות בחוברת שמורות לכותבים. כל שימוש בחומר הכלול בחוברת זו, שאינו לצורכי תרגול עצמי ו/או הגשת תרגילים במסגרת חובות ההגשה של הקורס, כגון פרסום, שכפול, מכירה והפצה, בכל סוגי המדיה, בין אם למטרת רווח ובין אם לא, אסור בהחלט.

תוכן עניינים 3... סביבת העבודה Visual Studio 200 הנחיות להגשת תרגילים... דגשים בפתרון התרגילים... סגנון כתיבה ותיעוד של תוכניות... 2 אלגוריתמים פשוטים... טיפוסי נתונים... ביטויים... משפטי תנאי... 9 לולאות... 2 פונקציות... 2 רקורסיות... 3 מערכים... מצביעים... רשומות... 55 2

סביבת העבודה Visual Studio 200 פתיחת סביבת העבודה. פתחו את Microsoft Visual Studio 200 דרך סרגל "התחל" 2. בהפעלה הראשונה יופיע חלון לבחירת סביבה. בחרו את האופציה הראשונה: General Development Settings הערה: במקרה של טעות/שינוי ניתן להגיע שוב לתפריט זה. לאחר תחילת העבודה בסביבה, ע"י בחירת תפריט Tools -> Import and Export Settings Wizard 3

יצירת Project ראשון ב- Solution חדש. לפתוח את תפריט Project File New.2 בחרו בחלון Project Type את Visual C++ Win32.3 בחלון Templates בחרו את Win32 Console Application. בכדי להשלים את המשימה, יש לרשום שם ה- Solution וה- Project..5 לחצו.OK שם ה- Solution יצירת Solution חדש מסלול / מיקום לשמירה שם ה- Project

. לחצו.Next 7. סמנו פרויקט ריק, וסיום.. לחצו.Finish סימון לפתיחת אפליקציה ריקה 5

הוספת קובץ cpp ל- Project. לחצו עם הכפתור הימני בעכבר על תיקיית Source Files מתחת ל- Project המתאים, אשר נמצאת בחלון Solution Explorer מצד ימין..2 בחירו Add New Item 3. בחרו בחלון ה Categories את ה Code ובחלון ה Templates את ++C File. תנו שם לקובץ הקוד. סיומו אוטומטית יהיה.".cpp".5 לחצו.Add

פתיחת Project נוסף באותו Solution. לפתוח את תפריט Project File New 2. חשוב לוודא שבחרתם את Add To Solution ולא יצירת Solution חדש. 3. המשיכו כמו בפתיחת Project ראשון. הערה: דרך נוספת להוספת Project חדש ל- Solution קיים היא ע"י לחיצה עם הלחצן הימני של העכבר על Solution ב- Solution.Explorer בחירת האפשרות להוספה לאוגדן קיים 7

קומפילציה. הקליקו עם הלחצן הימני על הפרויקט הרצוי ובחרו.Build

הרצה. וודאו שה- Project אותו אתם רוצים לקמפל ולהריץ הוא ה- Active Project )שמו מופיע מודגש ב- Solution.)Explorer אם לא הקליקו עם הלחצן הימני על הפרויקט הרצוי ובחרו Set as StartUp Project 9

.2 בתפריט Debug בחרו באופציה Start without debugging )או בקיצור )CTRL+F5

הנחיות להגשת תרגילים. עליכם להגיש את התרגילים בצורה ברורה ומסודרת. הקפידו לרשום על גבי התרגיל את שמכם המלא, מספר תעודת זהות, שם הקבוצה אליה אתם רשומים, מספר התרגיל ותאריך ההגשה. שדכו ביחד את כל הדפים של התרגיל אבל אל תכניסו אותם למעטפות או ניילונים מכל סוג שהוא. ההגשה היא לתא של בודק התרגילים של קבוצתכם )לא לתא של המרצה/מתרגל(. שימו לב: שמרו לכם עותק מלא של התרגיל שהגשתם! 2. כל ההנחיות הבאות מתיחסות שאלות שבהן פתרון השאלה היא תוכנית או פונקציה בשפת.C/C++ בשאלות אחרות יצוין אופי ההגשה בהערה מתאימה. 3. עליכם להגיש את התוכניות והפונקציות המהוות את פתרון התרגיל מודפסות )הדפסה של קובץ.).cpp. אופן תיעוד התוכניות והפונקציות מפורט בהמשך תחת הכותרת "סגנון כתיבה ותיעוד של תוכניות". 5. עליכם לכלול בפתרון גם דוגמאות הרצה, כלומר להדפיס את הפלט של התוכנית/פונקציה עבור קלטים מייצגים. קלטים מייצגים יכללו קלט "טיפוסי כללי" ומקרי קצה. יש להפעיל שיקול דעת בבחירת הקלטים המייצגים. את דוגמת ההרצה יש להעתיק מן המסך לקובץ טקסט ).txt( במלואה ללא עריכה.. אין להגיש קוד אשר אינו עובר קומפילציה בהצלחה. 7. בתשובה לשאלה שבה אתם מתבקשים לכתוב פונקציה, כתבו גם תוכנית )main( שמריצה אותה וצרפו אותה כחלק מהפתרון. לפעמים יש הוראות מפורשות בגוף השאלה כיצד יש לבדוק את הפונקציה וכאשר אין הוראות כאלה הפעילו שיקול דעת בהתאם למוסבר לעיל. ניתן לבדוק מספר פונקציות בעזרת main אחת כדי לחסוך במקום ובהדפסות, כל עוד התוצאה הסופית קריאה ובהירה )ראו "דגשים בפתרון תרגילים"(. דגשים בפתרון התרגילים הקפידו על סגנון כתיבה ותיעוד נכונים כפי שמפורט בפרק "סגנון כתיבה ותיעוד של תוכנית". אלא אם נאמר אחרת, תוכניות/פונקציות אינן צריכות לבדוק את תקינות הקלט ואינן צריכות לטפל בקלט לא תקין. אלא אם נאמר אחרת, לפונקציות אסור לשנות את הקלט שלהן. בכתיבת הפתרונות עליכם להקפיד על נכונות ויעילות של האלגוריתמים. במימוש האלגוריתמים עליכם להקפיד על שימוש נכון ויעיל בתחביר של שפת C. עליכם להקפיד על הנדסת תוכנה טובה ובפרט להקפיד על חלוקה הגיונית לפונקציות ועל מודולריות. במיוחד, אם ה- main או אחת הפונקציות האחרות יוצאת ארוכה מדי דאגו לפצל אותה בצורה מושכלת לפונקציות משנה. בפתרונות מותר להשתמש אך ורק בחומר )שיטות ופקודות בשפה( שנלמד בקורס עד לפרק הרלבנטי...2.3..5..7

סגנון כתיבה ותיעוד של תוכניות סגנון כתיבה נוח ותיעוד נכון הכרחיים לצורך קריאה והבנה של התוכנית שכתבתם, שימוש בה ותחזוקה ופיתוח שלה בעתיד. לכן, בבדיקת התרגילים יבדקו בנוסף לנכונות ויעילות התוכנית, גם סגנון הכתיבה ואופן התיעוד שלה. בנושא זה אין נוסחה אחת מחייבת ויש מקום גם לשיקול דעת וגם לטעם אישי. ההנחיות שיפורטו להלן מסכמות את מה שנראה לנו כדרישות בסיסיות ומקובלות על הרוב. תיעוד:. כל תוכנית תתחיל בכותרת, שתכיל: שם הקובץ. א. הסבר כללי של מה עושה התוכנית. ב. שם המתכנת, ותאריך כתיבת התוכנית. ג. 2. כל אלגוריתם שאינו טריביאלי מחויב בתיעוד. התיעוד יתחלק לשניים: א. הסבר כללי של האלגוריתם הכולל: אפיון מדויק של הקלט והפלט, אופן פעולת האלגוריתם ושיקולים חשובים במימוש. חלק זה ייכתב בצמוד ולפני קטע התוכנית המממש את האלגוריתם. ב. לשורות קוד חשובות יוצמד הסבר קצר וענייני המפרט את תפקידן של שורות אלו במכלול. 3. בחירת שמות משמעותיים למשתנים לקבועים ולפונקציות. שם מוצלח יכול לחסוך הערות תיעוד.. כל פונקציה נוספת בה משתמשת התוכנית תתועד אף היא. התיעוד יכלול: הסבר קצר של מה תפקיד הפונקציה )מה היא עושה(. א. איך מתבצע השימוש בפונקציה: יפורט תפקידו של כל אחד מהפרמטרים של הפונקציה בין אם הוא פרמטר ב. קלט, פלט, או שניהם, וכן יפורט מה הוא הערך המוחזר של הפונקציה. האלגוריתם שבבסיסה, כפי שמוסבר בסעיף 2. ג. יש לציין במפורש מה הן ההנחות על הקלט, אם יש כאלה. ד. 5. את התיעוד ושמות המשתנים יש לכתוב באנגלית בלבד ובמילים מן המילון האנגלי למשל sum ולא schum סגנון:. אינדנטציה נוחה. 2. שימוש בשורות רווח, קוים וכותרות להפרדה בין חלקים עיקריים בתוכנית והבלטה ויזואלית של המבנה הלוגי שלה. 3. שמות קבועים יש לכתוב באותיות גדולות בלבד, הפרדה בין מילים )בשם הקבוע( תתבצע ע"י קו תחתון )התו '_'.). בשמות משתנים ופונקציות בני יותר ממילה אחת, הפרדה בין מילים תתבצע לפי אחת מהשיטות המקובלות שתפורטנה בהרצאה )למשל, ע"י אות גדולה בתחילת כל מילה(. 5. ריכוז הגדרות של קבועים, הגדרות טיפוסים, הצהרות על פונקציות, וכו' תחת כותרות מתאימות לפני ה- main. 2

דוגמא לתוכנית מתועדת: //addnum.cpp //This program adds two integers entered by the user and prints the //result. //Mully 82 September 200 //------------------------------------------------------------------ #include <iostream> using namespace std; // Algorithm (documented for pedagogical purpose only): // Input: two integers. // Output: their sum. //. Ask the user for two numbers. // 2. Carry the computation and store the result in sum. // 3. Print out the result. void main)( //declaration of variables int num; int num2; int sum; //input by user //input by user //getting input from user cout << "Please enter two integers separated by a space:\n"; cin >> num >> num2; //computation sum = num + num2; //outputing the result cout << num << "+" << num2 << " = " << sum << "\n\n"; 3

אלגוריתמים פשוטים: 22 שאלה :,38A 6,5 7, 2 תרגמו לבסיס : א. 5 5 תרגמו לבסיס,5,6DA 6,7 : 2 ב. 7 95,3EA 6, 2 תרגמו לבסיס : ג. תרגמו למשלים ל- 2 בשמונה ביטים:,-2, 2 0,-09 ד. נתונים המספרים הבאים בייצוג משלים ל- 2 בשמונה ביטים. מצאו את ערכם העשרוני: ה.,,, פרטו את חישוביכם. הערה: התשובות לשאלות 2-5 צריכות להכתב בפסאודו-קוד ולא כתוכניות. אפשר להגיש אותן לא מודפסות, בכתב יד ברור וקריא. שאלה 2: כתבו אלגוריתם הפותר כל משוואה מהטיפוס = 0 b ax + )כלומר - כל משוואה ליניארית בנעלם אחד(. קלט: מקדמי המשוואה a ו- b )מספרים ממשיים(. פלט: הדפסת פתרון x, או הודעה מתאימה אם אין למשוואה פתרון )ממשי(, או שיש לה אינסוף פתרונות. שאלה 3: כתבו אלגוריתם המקבל מספר טבעי )שלם גדול מאפס(, ובודק האם ספרות המספר מהוות סדרה עולה ממש משמאל לימין. קלט: מספר טבעי -.num פלט: כן, אם הספרות של num מהוות סדרה עולה ממש משמאל לימין, לא, בכל מקרה אחר. לדוגמא, ספרות המספר 2579 מהוות סדרה עולה, אך ספרות המספר 42589 אינן מהוות סדרה עולה. הערה: סדרה עולה ממש אם כל מספר בסדרה גדול ממש מקודמו. למשל,,,2 3 עולה ממש ואילו,2,2,3 עולה אך אינה עולה ממש. סדרה באורך אחד היא סדרה עולה ממש. שאלה 4: כתבו אלגוריתם המדפיס את לוח הכפל. קלט: מספר טבעי n. פלט: הדפסה של לוח-כפל בגודל. n n 2 3 4 5 2 4 6 8 0 3 6 9 2 8 4 8 2 6 20 5 0 5 20 25 לדוגמא, עבור 5=n האלגוריתם ידפיס: הערה - על מנת להדפיס רווח מתאים בין העמודות ניתן להשתמש בפעולה הבסיסית: "הדפס רווח עד לתחילת עמודה".

שאלה 5: כתבו אלגוריתם המדפיס כוכביות בצורת שעון חול. קלט: מספר טבעי אי זוגי - n. פלט: הדפסת כוכביות בצורה של שעון חול, שבסיסיו )העליון והתחתון( בעלי n כוכביות. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * לדוגמא, עבור 7=n האלגוריתם ידפיס: שאלה 6: כתבו והריצו תוכנית שכותבת את שמכם, שם הקורס ומספר ת"ז שלכם בשתי שורות נפרדות. פעלו לפי הנאמר בסעיף "הנחיות להגשת תרגילים". 5

טיפוסי נתונים: שאלה : הגדירו קבועים המייצגים את הדברים הבאים )אין צורך לכתוב תוכנית(:.שנה זו )שנת 2(. 2.התו 'x' שמשמש למטרה הבאה: הקשת x ע"י המשתמש תסיים את התוכנית. הערה: זכרו לתת לקבועים שמות משמעותיים ולהשתמש אך ורק באותיות גדולות ובקו תחתון )'_'(. לדוגמה, הגדרת הקבוע יכולה להיעשות כך: ;3.458 = PI.const double הערה: אפשר להגיש את התשובה לא מודפסת, בכתב יד ברור וקריא. שאלה 2: נתונה התוכנית הבאה: #include <iostream> using namespace std; void main() double x, y; cout << "please enter a length in centimeters: "; cin >> x; y = 0.3937 * x; cout << "The length is equal " << y << " in inches\n"; שכתבו תוכנית זו עפ"י כללי כתיבה בהירה. הקפידו על שמות משמעותיים למשתנים, אינדנטציה, הגדרת קבועים, תיעוד, וכו'. הערה: אפשר להגיש את התשובה לא מודפסת, בכתב יד ברור וקריא. שאלה 3: כתבו תוכנית שקולטת רדיוס של מעגל ומדפיסה את היקפו ושטחו של המעגל. קלט: רדיוס המעגל. פלט: שטח והיקף המעגל. הערה: זכרו לכתוב עפ"י כללי כתיבה בהירה. פעלו לפי הנאמר בסעיף "הנחיות להגשת תרגילים".

שאלה 4: נתונה התכנית הבאה: #include<iostream> using namespace std; void main( ) int j = -999,k = - 998,h = - 997; cout << \nenter 2 numbers: cin >> j; cin >> k; cout << \nthe variable j is << j; cout << \nthe variable k is << k; cout << \nenter 2 numbers: ; cin >> h; cin >> j; cout << The variable h is << h; cout << The variable j is now << j; 2 7 5 00 0xa 07 500 0 2 3 4 5 2 "3" 4 2.4 5 6 abcd 2 4 מריצים תוכנית זו על ששת הקלטים הבאים: שימו לב: הסימן מייצג הקשה על מקש.ENTER לגבי כל הרצה: אם הקלט תקין רשמו מה תדפיס התוכנית, ואם לא ציינו במפורש באיזו שורה בתוכנית נכשלה הפונקציה.cin 7

שאלה 5: נתונה התכנית הבאה: #include<iostream> 2 using namespace std; 3 void main ( ) 4 int j, k; 5 double r; 6 char c; 7 8 c = '9'; 9 j = (int)c; 0 r = 8.2; k = (int)r; 2 k = k + 0.9; 3 j = r + 0.9; 4 c = (char)r; 5 השלימו בטבלה הבאה את ערכם העשרוני של המשתנים, או ציינו שהמשתנה אינו מאותחל: משתנה j k r c מס' שורה 8 לא מאותחל לא מאותחל לא מאותחל 9 0 2 3 4 הערה: אפשר להגיש את התשובה לא מודפסת, בכתב יד ברור וקריא. שאלה 6: כתבו תכנית הקולטת מהמשתמש שבעה תווים ומבצעת:.מדפיסה אותם במשולש הפוך. 2.מדפיסה בשורה את ערכי ה- ASCII שלהם. דוגמה: קלט: student פלט: s t u d e n t 5 6 7 00 0 0 6 הערה לשיפור הקריאות של תוכניתכם: הפרידו בעזרת רווחים ותיעוד מתאים, את החלק בתוכניתכם המדפיס את המשולש, מהחלק המדפיס את ערכי ה-.ASCII ראו זאת כהערה כללית והפעילו זאת בעת הצורך בתוכניותיכם הבאות.

שאלה 7: כתבו תכנית הקולטת זמן יציאה לדרך, ואת משך נסיעה בשניות. התוכנית מדפיסה את זמן ההגעה המדויק. כל הזמנים )יציאה והגעה( יוצגו בפורמט hour min sec המוגדר כך:. hour - מספר שלם בין ל.23.2 min - מספר שלם בין ל.59.3 sec - מספר שלם בין ל.59 הקלט: ארבעה מספרים שלמים.. שלושה מספרים שלמים לציון זמן יציאה בפורמט.hour min sec 2. מספר שלם חיובי כלשהו לציון משך הנסיעה בשניות. הפלט: זמן ההגעה בפורמט.hour min sec לדוגמה: עבור הקלט 2 3 0 4004 )כלומר זמן יציאה לדרך שעה שתים עשרה ושלושים ואחת דקות ועשר שניות ומשך נסיעה שניות(, הפלט יהיה 3 37 54 )שעה שלוש עשרה ושלושים ושבע דקות וחמישים וארבע שניות(. הערה: שימו לב שבפלט מתעלמים מיחידות הזמן הגדולות יותר )יום, חודש, שנה...(. שאלה 8: מקסימום רישא של סדרת מספרים a,a2,,an הם n המספרים הבאים: a, max(a, a2), max(a, a2, a3),, max(a, a2,, an) דוגמא: מקסימום הרישא של הסדרה:,5,,9,2 6 הינו הסדרה: 5, 5, 9, 2, 2 כתבו תכנית הקולטת ארבעה מספרים שלמים אי שליליים ומבצעת את הדברים הבאים:. הדפסת מקסימום הרישא של המספרים שנקלטו. השתמשו לשם כך בפונקצית הספרייה max( max ולפניו פעמיים קו תחתון( שמוגדרת כך: int max(int a, int b); למשל ההשמה c = max(a, b); תשים ל- c את המקסימלי מבין a ו- b. הערה: כדי להשתמש בפונקצית ספריה זו יש להוסיף בתחילת התוכנית <stdlib.h>.#include 2.הדפסת הממוצע החשבוני המדויק של ארבעת המספרים )כלומר ללא קיצוץ הספרות שאחרי הנקודה(. 3. הדפסת הממוצע החשבוני של ארבעת המספרים תוך כדי עיגול הממוצע לשלם הקרוב ביותר )במקרה של חצי מעגלים למעלה(. הערה: אין להשתמש במשפט תנאי,(if else ) גם אם אתם מכירים את התחביר. 9

ביטויים: שאלה : בשאלה זו יש רשימה ממוספרת של ביטויים ב- C שבהם מופיעים שלושה משתנים, x,y,z מטיפוס.int משתנים אלה מאותחלים מחדש לערכים = 4 x, z = 6 y, = 5 לפני חישוב הביטוי. לכל ביטוי יש לרשום מהו הערך שלו ומהי תוצאת הלוואי effect) (side בחישוב הביטוי. למשל )x מאותחל כל פעם ל- (: ביטוי: 4=x ערך הביטוי: תוצאת לוואי: השמת הערך למשתנה x. ביטוי: ++x ערך הביטוי: )הערך הקודם של המשתנה x )לפני חישוב הביטוי(( תוצאת לוואי: ערכו של x ישתנה ל - ( + הערך הקודם של x( ביטוי: x++ ערך הביטוי: ) + הערך הקודם של המשתנה x )לפני חישוב הביטוי(( תוצאת לוואי: ערכו של x ישתנה ל- ( + הערך הקודם של ) x. x = y; 2. z = x = y; 3. x = ++y; 4. x = y++; 5. x = ++y + 4; 6. x = y++ + 4; 2

משפטי תנאי: שאלה : כתבו תוכנית הקולטת מהמשתמש שלושה נתונים: גיל )בשנים(, משקל )בק"ג(, וגובה )בס"מ( התוכנית מדפיסה המלצה לאחד משלושה תפריטים יומיים )A או B או C(, או הודעה שאין במאגר תפריט מתאים. ההמלצות נקבעות עפ"י הטבלה הבאה: 2- A C C -2 A B A 2- A B C היחס גובה למשקל ( הגיל height ) weight [0.5, 2) [2, 3.5) [3.5, 5] למשל, לאדם בגיל, בגובה מטר שמונים, השוקל ק"ג, יומלץ תפריט B. הערה: השתדלו למצוא פשרה נאותה בין צמצום מספר משפטי התנאי, לבין קריאות התוכנית. שאלה 2: כתבו תוכנית הקוראת שלושה מספרים ממשיים ומדפיסה אותם לפי הסדר מהגדול לקטן. אין להשתמש לשם כך בפונקצית הספרייה. max שאלה 3: בשאלה זו נחזור על המשימה שבשאלה 7 בפרק "טיפוסי נתונים קבועים והשמות" בתוספת התמודדות עם שגיאות לוגיות בהזנת הקלט )ראו הערה למטה(. כתבו תכנית הקולטת זמן יציאה לדרך, ואת משך נסיעה בשניות. התוכנית מדפיסה את זמן ההגעה המדויק. כל הזמנים )יציאה והגעה( יוצגו בפורמט hour min sec המוגדר כך:. hour - מספר שלם בין ל.23.2 min - מספר שלם בין ל.59.3 sec - מספר שלם בין ל.59 הקלט: ארבעה מספרים שלמים.. שלושה מספרים שלמים לציון זמן יציאה בפורמט.hour min sec 2. מספר שלם חיובי כלשהו לציון משך הנסיעה בשניות. הפלט: זמן ההגעה בפורמט.hour min sec לדוגמה: עבור הקלט 2 3 0 4004 )כלומר זמן יציאה לדרך שעה שתים עשרה ושלושים ואחת דקות ועשר שניות ומשך נסיעה שניות(, הפלט יהיה 3 37 54 )שעה שלוש עשרה ושלושים ושבע דקות וחמישים וארבע שניות(. הערות:. על התוכנית להוציא הודעה מתאימה ולעצור אם נתקלה בקלט לא חוקי לוגית )אפשר להניח שהקלט הוא מספרים שלמים אבל יתכן שהם אינם בפורמט שפורט למעלה(. 2. בקלט ובפלט נתעלם מיחידות הזמן הגדולות יותר )יום, חודש, שנה...(. 2

const int ROUND_DOWN = ; const int ROUND_UP = 2; const int ROUND = 3; שאלה 4: הגדירו את הקבועים הבאים: Choose your round method:. Floor round 2. Ceiling round 3. Round to the nearest whole number כתבו תכנית אשר מבקשת מהמשתמש לבחור פעולה מהתפריט הבא: על התוכנית לקלוט מהמשתמש את בחירתו )-3( ומספר ממשי אותו ירצה לעגל, ולהדפיס את תוצאת עיגולו לפי השיטה שבחר המשתמש. 22

לולאות: שאלה : סכימה של אלגוריתם הוא תיאור על של מבני הבקרה )לולאות ומשפטי תנאי( בהם משתמש האלגוריתם. תיאור זה אינו כולל את התנאים הלוגיים של מבני הבקרה, אלא רק את היררכית הקינון שלהם. דוגמא א: נסתכל על תוכנית המקבלת מספר טבעי אי זוגי, N, ומדפיסה משולש של כוכביות, כך שבשורה הראשונה תופיע כוכבית אחת, בשורה השנייה שלוש כוכביות,וכך הלאה עד השורה האחרונה שבא תודפסנה N כוכביות. * *** ***** עבור קלט 5=N תדפיס התוכנית: הסכימה של אלגוריתם זה היא: לולאה העוברת שורה אחר שורה // for( ; ; ) לולאה המדפיסה רווחים // for( ; ; ) לולאה המדפיסה כוכביות // for( ; ; ) מעבר שורה // שימו לב כי אין התייחסות לאינדקסים ולתנאים הלוגיים של הלולאות, אלא רק לתפקיד של כל לולאה ולמבנה המקונן שלהן. דוגמא ב: נסתכל על תוכנית הקולטת מספר לא ידוע מראש של מספרים טבעיים. התוכנית מדפיסה את סכום הספרות של כל מספר שנקלט. סוף הקלט מצוין ע"י -. עבור הקלט: 9 5 57 - יתקבל הפלט: 7 5 2 3 הסכימה של אלגוריתם זה היא: לולאה העוברת מספר אחר מספר מהקלט // while( ) לולאה הסוכמת את ספרות המספר הנוכחי// while( ) 23

עבור כל חלק בשאלה זו עליכם לתכנן אלגוריתם המתאים לפתרון הבעיה, לתאר את סכימת האלגוריתם ולממש את האלגוריתם כתוכנית בשפת C. בכל סעיף של שאלה זו, יש לצרף את סכימת האלגוריתם בהגשת הפתרון. א. כתבו תכנית הקולטת מספר טבעי, N, ומדפיסה מבנה כוכביות באופן הבא: המבנה מורכב מחלק ימני וחלק שמאלי המכילים משולש כוכביות ומיושרים לצד ימין או שמאל בהתאם, כאשר רק בשורה האחרונה אין רווח בין שני החלקים. לדוגמא עבור 5=N יודפס המבנה הבא: כוכבית אחת בכל חלק שתי כוכביות בכל חלק שלוש כוכביות בכל חלק ארבע כוכביות בכל חלק חמש כוכביות בכל חלק * * ** ** *** *** **** **** ********** ב. כתבו תוכנית הקולטת מהמשתמש אות אנגלית קטנה ומדפיסה משולש אותיות באופן הבא: בשורה הראשונה תופיע האות, a בשורה השנייה הרצף, aba בשורה השלישית הרצף abcba וכך הלאה עד שבמרכז השורה האחרונה תופיע האות שנקלטה. a aba abcba abcdcba לדוגמא עבור הקלט d יודפס: ג. כתבו תוכנית הקולטת מהמשתמש שני מספרים טבעיים n ו- k. התוכנית תדפיס n שורות, כאשר כל שורה מורכבת מ- k חלקים. כל חלק מכיל n מספרים, ומסתיים בתו @. i, i,, n, 0,, בשורה ה- i כל חלק יכיל את המספרים:., i הערה: השורות ממוספרות מ- עד -n. 0 2 3 4 @ 0 2 3 4 @ 0 2 3 4 @ 2 3 4 0 @ 2 3 4 0 @ 2 3 4 0 @ 2 3 4 0 @ 2 3 4 0 @ 2 3 4 0 @ 3 4 0 2 @ 3 4 0 2 @ 3 4 0 2 @ 4 0 2 3 @ 4 0 2 3 @ 4 0 2 3 @ לדוגמא עבור 5=n ו- 3=k, התוכנית תדפיס: 2

ד. כתבו תוכנית הקולטת מהמשתמש שני מספרים טבעיים n ו- k. התוכנית תדפיס n שורות. כל שורה מורכבת מ- k חלקים. כל חלק מכיל n סימני $ ו- #, ומסתיים בתו @. בשורות i האי-זוגיות )..,,3,5( כל חלק )בגודל n( יתחיל ב- i סימני $ רצופים, ואחריהם בשאר המקומות סימני #. בשורות i הזוגיות ),2,4,6( כל חלק )בגודל n( יתחיל ב- i סימני # רצופים, ואחריהם בשאר המקומות סימני $. הערה: השורות ממוספרות מ- עד n. לדוגמא עבור 5=n ו- 3=k, התוכנית תדפיס: $ # # # # @ $ # # # # @ $ # # # # @ # # $ $ $ @ # # $ $ $ @ # # $ $ $ @ $ $ $ # # @ $ $ $ # # @ $ $ $ # # @ # # # # $ @ # # # # $ @ # # # # $ @ $ $ $ $ $ @ $ $ $ $ $ @ $ $ $ $ $ @ שאלה 2: כתבו תכנית הקולטת סדרה של מספרים שלמים ואי שליליים. התכנית צריכה להדפיס: א. ממוצע אלגברי )חשבוני( של כל המספרים שנקראו. ממוצע גיאומטרי )הנדסי( של כל המספרים הגדולים מאפס. ב. ג. חיזרו על התוכנית מחלק א' כאשר הפעם מספר המספרים בקלט אינו ידוע מראש. המספר הראשון בקלט יציין את אורך סדרת המספרים, ואחריו תופיע הסדרה באורך המתאים. חיזרו על התוכנית מחלק א' כאשר שוב מספר המספרים בקלט אינו ידוע מראש. הפעם סוף הקלט מסומן על ידי המספר - שמופיע בקלט לאחר סדרת המספרים )כלומר - אינו חלק מהסדרה(. הנחיות והערות: תזכורת: N. מספרים הוא סכום המספרים מחולק ב- N ממוצע חשבוני של o o ממוצע גיאומטרי של N מספרים הוא השורש ה- N י של מכפלת המספרים. שימו לב שממוצע זה מוגדר רק אם כל N המספרים חיוביים. השתמשו בפונקציה pow )המוגדרת בספריה )math.h לחישוב השורש ה- N י. יש לטפל בכל מצבי השגיאה הבאים:. שגיאה לוגית קבוצת המספרים החיוביים ריקה לא ניתן לחשב ממוצע גיאומטרי. במקרה זה על התוכנית להודיע הודעה מתאימה, לחשב ולהדפיס את הממוצע האלגברי ולהסתיים. שגיאה לוגית קבוצת המספרים ריקה לא ניתן לחשב ממוצע גיאומטרי וממוצע אלגברי. במקרה זה על התוכנית להודיע הודעה מתאימה ולהסתיים..2 25

שאלה 3: כתבו תכנית הקולטת מספר אוקטלי )בסיס ( שאורכו אינו ידוע מראש, וממירה אותו למספר עשרוני. יש לקרוא את המספר מן הקלט כרצף של תווים )0,,2,3,4,5,6,7( ללא רווחים ביניהם המסתיים בהקשת )'n\'(. ENTER דוגמא: קלט: 375 פלט: 253 )כי = 253 5 7*8 + )3*8 2 + רמז: a n a n- a n-2 a ערכו של המספר האוקטלי a 0 הוא: ( ((a n * 8 + a n- ) * 8 + a n-2 ) * 8 + + a ) * 8 + a 0 כאשר a 0 הוא ה-,least significant digit ו- a n הוא ה- most significant digit כלומר בכל איטרציה עלינו להכפיל את התוצאה הקודמת ב- 8 ולהוסיף את הספרה הבאה. שאלה 4: כתבו תוכנית הקולטת מספר טבעי ובודקת האם ספרותיו מהוות פלינדרום. פלינדרום הוא מספר אשר ערכו יהיה זהה בין אם נקרא אותו מימין לשמאל ובין אם נקרא אותו משמאל לימין. דוגמה א': קלט: 573705 פלט: 5073705 is palindrome דוגמה ב': קלט: 57375 פלט: 507375 is not palindrome 2

שאלה 5: כתבו תכנית הקולטת מספר שלם חיובי המייצג מספר תעודת זהות, ללא אפס מוביל וללא ספרת ביקורת. התוכנית מחשבת ומדפיסה את מספר תעודת הזהות עם ספרת הביקורת. חישוב ספרת הביקורת של תעודת זהות נעשה בשלושה שלבים: בשלב הראשון כופלים את הספרות השונות ב- 2 וב- לסירוגין: הספרה האחרונה )הימנית ביותר( מוכפלת ב- 2. הספרה הלפני אחרונה )השניה מימין( מוכפלת ב-. הספרה שלפניה )השלישית מימין( מוכפלת ב- 2. וכן הלאה לסירוגין, עבור שאר הספרות )לא ידוע אם מספר הספרות זוגי או לא(. בשלב השני ס וכ מ ים את סכום הספרות של המכפלות שהתקבלו. )לדוגמא: אם אחת המכפלות הינה 2*7= אז היא תורמת לסכום 5, כי 5= (. + בשלב השלישי מקבלים את ספרת הביקורת בתור המספר האי-שלילי הקטן ביותר שניתן להוסיף לתוצאת הסכום )שהתקבלה בשלב השני( בכדי להגיע לכפולה של. )לדוגמא: אם הסכום הכולל של ספרות הוא 2 הרי שספרת הביקורת היא, כי = 3, 2 + ו- 3 הינו כפולה של הקרובה ביותר ל- 2(. לדוגמא עבור ת"ז מס 527 ספרת הביקורת היא, כיוון ש: 5 2 7 ספרות תעודת הזהות: 2 2 2 הכופלים )לכל ספרה(: --------------------- המכפלות )לכל ספרה(: +0+6+4+8++4 = 2 סיכום סכום הספרות: ו- הוא המספר האי שלילי הקטן ביותר אשר ניתן להוסיף לסכום 2 כדי להגיע לכפולה של. 27

N 2 N 2 שאלה 6: כתבו תוכנית הקוראת מקדמים שלמים שונים מאפס A,B,C,D למשוואה בשלושה נעלמים. A x B y C z D וכן מספר שלם וזוגי N המגדיר תחום. התוכנית מוצאת את מספר הפתרונות השלמים של המשוואה, אשר ערכם בין ל- וכן אחד מן הפתרונות הללו. כלומר יש למצוא שלשות (x,y,z) של מספרים שלמים, המקיימות את המשוואה וכן מקיימות,y x, ולספור אותן. z N N 2 2 קלט: המספר, A המספר, B המספר,C המספר, D המספר N פלט: א. מספר הפתרונות בתחום. ב. אחד מהפתרונות שמצאתם למשוואה, במידה ויש כאלו. דוגמא: A 2, B 3, C, עבור קלט: D 5, N 4 יתקבל הפלט: = 5 -*z There are 6 solutions for 2*x -3*y Where: -2 <= x,y,z <= 2 One such solution is (2,0,-) שימו לב כי אין חשיבות לפתרון הנבחר להדפסה, בדוגמא לעיל ניתן היה לבחור כל אחד מבין הפתרונות : (-,-2,-), (0,-2, ), (0,-,-2), (,-, 0), (2,-,2), (2,0, -) הנחיות והערות: ראשית יש להדפיס את מספר הפתרונות ורק אחר כך דוגמא לפתרון שמצאתם. 4, A ו-: B 8, C, D הגישו שלוש דוגמאות הרצה שבכולן 30 N=0 o N=0 o N=000 o אלגוריתם לא יעיל יגרום לתוכניתכם לרוץ לאט יחסית על קלטים בהם N גדול. אלגוריתם יעיל ישפר זמן ריצה זה בערך פי N. 2

שאלה 7: בנוסף לייצוג מספרים בבסיס עשרוני, בינארי או כל בסיס אחר, ישנה שיטה אחרת לייצוג מספרים הידועה בשם "השיטה הרומית". בתרגיל זה נעסוק בגירסא מפושטת של השיטה הרומית, אותה נכנה השיטה הרומית הבסיסית. הספרות הרומיות וערכיהן הם: ערך עשרוני ספרה רומית I V 5 X 0 L 50 C 00 D 500 M,000 מספר בשיטה הרומית הבסיסית הוא סדרה של ספרות רומיות המקיימת את התנאים הבאים:. הספרות, משמאל לימין, מהוות סדרה יורדת חלש )לא עולה(. לדוגמא: MXII הוא חוקי, XIIM אינו חוקי. )שימו לב שבשיטה הרומית הבסיסית תמיד כל המופעים של תו מסוים בסדרה חוקית הם רצופים, וזאת מאחר והסדרה אינה עולה( מספר המופעים של הספרה M איננו מוגבל. הספרות, D,L,V יכולות להופיע פעם אחת לכל היותר. הספרות, C,X,I יכולות להופיע ארבע פעמים לכל היותר. לדוגמא: VIIII היא סדרה חוקית שמייצגת את המספר 9 אך VIIIII אינה סדרה חוקית ובמקומה יש לרשום פשוט. X.2 על מנת להעריך מספר המיוצג בשיטה הרומית הבסיסית, יש לסכום את ערכן העשרוני של כל הספרות הרומיות שבמספר. לדוגמא: XI means 0 + = XXVI means 0 + 0 + 5 + = 26 א. ב. כתבו תכנית המקבלת מספר שלם חיובי מהקלט ומדפיסה אותו בייצוג רומי בסיסי. כתבו תכנית המקבלת מהקלט רצף של תווים, ללא רווחים, המייצגים מספר בשיטה הרומית הבסיסית. על התוכנית להדפיס את ערכו העשרוני של המספר שהתקבל. הנחיות והערות: על התוכנית לבדוק את תקינות הקלט. במידה והתגלתה שגיאת קלט יש להודיע הודעה מתאימה ולסיים את ריצת התוכנית. 29

פונקציות: #include <iostream> using namespace std; שאלה : נתונה התוכנית הבאה: void f(int k) cout << f: k = " << k << \n ; k =3; int g(int k) cout << g: k = << k << \n ; k = k*2; return 7; int h(int k) cout << h: k = << k << \n ; if (k == 0) cout << return \n ; return ; else cout << return 0 \n ; return 0; int h(int k) int i; cout << h: k = << k << \n ; if (k == 0) cout << return \n ; return ; else i= h(0); cout << return << i << \n ; return i; void main()......... 3

בכל אחד מהסעיפים a עד g, החליפו את ה- main של התוכנית לעיל ב- main הניתן בסעיף וקיבעו האם התוכנית תעבור קומפילציה או לא. אם התוכנית אינה עוברת קומפילציה, כתבו מדוע. אם התוכנית עוברת קומפילציה כתבו מה יהיה הפלט של התוכנית, בהנחה שהקלט הניתן לתוכנית ב- cin הוא המספר השלם והחיובי α. a) void main() int k; cin>>k; cout << main: k = << k << \n ; f(k); cout << main: k = << k << \n ; b) void main() int k; cin>>k; cout << main: k = << k << \n ; k = f(k); cout << main: k = << k << \n ; c) void main() int k; cin>>k; cout << main: k = << k << \n ; g(g(k)); cout << main: k = << k << \n ; d) void main() int k; cin>>k; cout << main: k = << k << \n ; k = g(g(k)); cout << main: k = << k << \n ; 3

e) void main() int k; cin>>k; h(h(k)); f) void main() int k; cin>>k; h(2); g) void main() int k; cin>>k; cout << main: k = << k << \n ; g(int k); cout << main: k = << k << \n ; שאלה 2: כתבו את שתי הפונקציות הבאות והשתמשו בהן לכתיבת תוכנית הקוראת 3 מספרים ממשיים ומדפיסה את הקטן ביותר ואת הגדול ביותר. א. פונקציה המקבלת 3 מספרים ממשיים ומחזירה את הגדול ביותר מביניהם. אין להשתמש בפונקציות נוספות לכתיבת פונקציה זו. השתמשו במספר השוואות מינימלי. ב. פונקציה המקבלת 3 מספרים ממשיים ומחזירה את הקטן ביותר מביניהם. יש להשתמש לשם כך בפונקציה מסעיף א', ואסור לבצע כל השוואות נוספות. הערה: בשאלה זו אין צורך בדוגמאות הרצה. 32

שאלה 3: א. כתבו פונקציה המקבלת מספר שלם חיובי ומחזירה את המספר בסדר ספרות הפוך. n ( dmdm שימו לב: אם n הוא מספר שלם וחיובי שהצגתו בבסיס עשרוני היא: (d0 dm 2... אז המספר ההפוך ל- n, בבסיס עשרוני הוא: m m. Reverse( n) d0 0 d 0... d m דוגמא: עבור הקלט 23 תחזיר הפונקציה את המספר 32. עבור הקלט 3 תחזיר הפונקציה את המספר 3. ב. השתמשו בפונקציה מסעיף א' על מנת לכתוב פונקציה בוליאנית המקבלת מספר חיובי ומחזירה true אם ורק אם המספר הוא פלינדרום. דוגמא: עבור הקלט 23 תחזיר הפונקציה.false עבור הקלט 232 תחזיר הפונקציה.true הערות והנחיות:. מספר הוא פלינדרום אם קריאת סדרת ספרותיו משמאל לימין זהה לקריאה מימין לשמאל. 2. ניתן להניח כי הקלט תקין. 3. יש לספק דוגמאות הרצה רק עבור סעיף ב'. שאלה 4: א. כתבו פונקציה המקבלת שני פרמטרים: מספר שלם וחיובי,num ומספר שלם חיובי חד ספרתי,.num במספר,digit המייצג ספרה. הפונקציה מחזירה את מספר המופעים של הספרה,digit בדיקות תקינות: ניתן להניח שמספרי הקלט שלמים. בהנחה זו על הפונקציה לזהות את השגיאות הבאות:. digit אינו מספר חיובי חד ספרתי. 2. num אינו מספר חיובי. לשם כך, הגדירו את הקבועים הבאים: const int NEGATIVE_INPUT_NUMBER = -; const int ILLEGAL_DIGIT = -2; השתמשו בקבועים אלו, על מנת להחזיר את השגיאה המתאימה. לדוגמא: עבור הקלט num=22423 digit=2, תחזיר הפונקציה 3. עבור הקלט num=22423 digit=34, תחזיר הפונקציה.ILLEGAL_DIGIT ב. כתבו פונקציה בוליאנית המקבלת מספר חיובי ושלם ומחזירה true אם ורק אם כל ספרותיו שונות זו מזו. לדוגמא: עבור הקלט 25 תחזיר הפונקציה.true עבור הקלט 22 תחזיר הפונקציה.false 33

ג. השתמשו בפונקציות מסעיפים א' ו-ב' על מנת לכתוב פונקציה המקבלת שני פרמטרים: מספר חיובי ושלם,,num ומספר חיובי ושלם אשר כל ספרותיו שונות זו מזו,.digits על הפונקציה להחזיר את סכום מספרי המופעים של כל אחת מספרות,digits במספר.num בדיקות תקינות: ניתן להניח שמספרי הקלט שלמים. בהנחה זו על הפונקציה לזהות את השגיאות הבאות:. digits או num אינם חיוביים. 2. לא כל הספרות ב- digits שונות זו מזו. הגדירו קבועים מתאימים והשתמשו בהם על מנת להודיע על השגיאה הרלוונטית. דוגמא א': עבור הקלט num=22423 ו- digits=2 תחזיר הפונקציה. )כיוון ש- 2 מופיע בnum 3 פעמים ו- מופיע ב- num פעם אחת, הפונקציה צריכה להחזיר 3+ שזה ( דוגמא ב': עבור הקלט num=22423 ו- digits=2 תחזיר הפונקציה ערך המודיע על שגיאת הקלט. שאלה 5: כתבו פונקציה המקבלת שני מספרים: הראשון, מספר חיובי ושלם,num והשני מספר שלם וחיובי indices המייצג אינדקסים של ספרות. על הפונקציה לייצר ולהחזיר מספר המקיים שבמקום כל ספרה.num במספר d תופיע הספרה מהמקום )אינדקס( ה-,indices ב- d הערות:. הניחו שמספר הספרות ב- num וב- indices קטן או שווה ל-.9 2. ספרות המספר num ממוספרות משמאל לימין, כלומר הספרה שהאינדקס שלה הוא היא הספרה השמאלית ביותר ב- num. דוגמאות:. עבור הקלט num=4735 ו- indices=200 תחזיר הפונקציה את המספר 37. כיוון שהספרה ה- 2 ב- num היא, 3 הספרה ה- ב- num היא, הספרה ה- ב- num היא 7 והספרה ה- ב- num היא. 2. עבור הקלט num=3028 ו- indices=200 תחזיר הפונקציה את המספר 233. בדיקות תקינות: על ניתן להניח שמספרי הקלט שלמים. בהנחה זו על הפונקציה לזהות את השגיאות הבאות:. ב- indices מופיע אינדקס לא חוקי למספר.num 2. הפונקציה נקראה עם מספרים שאינם חיוביים. 3. num ו/או- indices מכיל יותר מ- 9 ספרות פרקו משימה זו לתתי משימות, והגדירו פונקציות עזר כנדרש )כפי שהודגם בשאלות 3,(. הגדירו קבועים מתאימים והשתמשו בהם על מנת להודיע על השגיאה הרלוונטית. 3

שאלה 6: כתבו כמה כוכביות יודפסו כאשר מריצים כל אחת משתי התוכניות הבאות. עליכם להסביר בצורה מפורטת כיצד הגעתם לפתרון ולפרט את החישובים. שימו לב כי הפונקציה fabs מחזירה את הערך המוחלט של משתנה מסוג.double הערה: תכנית זו מדגימה כיצד יש לבדוק שוויון או אי שוויון בין ערכים מסוג float או-.double מאחר וערכים אלו הם רק קירובים למספרים ממשיים, לא נבדוק שוויון או אי שוויון באמצעות == או =!, המשווים בצורה מדוייקת. למשל בתוכנית שלפנינו, במקום לבדוק האם =! 2.0 a, בודקים האם a ו- 2.0 רחוקים זה מזה יותר מרמת הדיוק,EPSILON כלומר בודקים האם:.fabs(a-2.0) > EPSILON #include<iostream> using namespace std; #include<math.h> const double EPSILON = 0.00000; void main() double a = 0.0; א. while (fabs(a-2.0) > EPSILON ) cout<<"*"; a = a + 0.; #include<iostream> using namespace std; #include<math.h> ב. const double EPSILON = 0.00000; void asterisks(double x) while (fabs(x-2.0) > EPSILON ) cout << "*"; x = x + 0.; void main() double a = 0.0; while (fabs(a-2.0) > EPSILON ) asterisks(a); a = a + 0.; הערה: אפשר להגיש את התשובה לא מודפסת, בכתב יד ברור וקריא. 35

שאלה 7: הפולינום( ( P הוא קירוב של הפונקציה cos(x) כאשר n 0 ו- x ניתן ברדיאנים: n x ( ) Pn ( x) x x x... x 2! 4! 6! (2 n)! 2 4 6 n 2n P ( x), P( x) x 0 2 2 שימו לב כי וכו'... ניתן להוכיח ששגיאת החישוב, כאשר משתמשים ב-( x Pn ( המוחלט על. cos( x) P ( x) n 2 n x 2 n! כלומר,. 2 n x 2 n! במקום ב-( cos(x המדויק, אינה עולה בערכה א. ב. ג. ד. ה. ו. כתבו את הפונקציה: (y,double factorial(int המקבלת כפרמטר מספר שלם y ומחזירה את!y. הערך המוחזר של הפונקציה )כלומר!y( הוא מטיפוס,double כדי לאפשר לעבוד עם ערכי y גדולים. כתבו את הפונקציה power המקבלת כפרמטרים מספר x מטיפוס double ומספר שלם y 0 ומחזירה את x. y אין להשתמש בפונקציות נוספות לכתיבת פונקציה זו. כתבו את הפונקציה fabsolute המחשבת ומחזירה את ערכו המוחלט של פרמטר מטיפוס.double כתבו את הפונקציה n) double cos (double x, int המחשבת קרוב ל- cos(x). P ( ) n השתמשו בפונקציות Factorial ו- Power )מסעיפים א' ו- ב'( לחישוב ערכו תוך שימוש ב x של כל איבר בטור. כתבו את הפונקציה (n double cos2 (double,x int המחשבת קרוב ל-. P ( ) n הדגש בכתיבת cos2 יהיה יעילות האלגוריתם. x תוך שימוש ב cos(x) שימו לב כי לא יעיל לחשב את החזקה ואת העצרת בכל פעם מחדש, אלא ניתן להשתמש בתוצאות של האיבר הקודם כדי למצוא את האיבר הבא, ובכך ניתן להקטין משמעותית את מספר פעולות הכפל והחילוק. כתבו את הפונקציה epsilon) double cos3 (double x, double.epsilon כך ששגיאת החישוב קטנה מ-, P ( ) n המחשבת קרוב ל- cos(x) תוך שימוש ב x השתמשו באלגוריתם היעיל מסעיף ה' על מנת לכתוב פונקציה זו. ב- 4 ז. בעזרת הפונקציות שכתבתם עד כה, כתבו תוכנית המחשבת את cos(x) בנקודה =.0 x דרכים שונות: עבור 0=n ע"י הפונקציה cos עבור 0=n ע"י הפונקציה cos2 עבור epsilon=0-0 ע"י הפונקציה cos3 וע"י פונקצית ספרייה ( )math.h לחישוב קוסינוס. הערה: יש לספק דוגמאות הרצה רק לסעיף ז'. 3

שאלה 8: א. כתבו את הפונקציה y_fact). void factorial (int y, double& הפונקציה מקבלת מספר שלם אי-שלילי: y ומחזירה )בעזרת פרמט פלט( את!y:.y_fact שימו לב כי נעשה שימוש ב- double כדי לאפשר עבודה עם מספרים גדולים. ב. ג. כתבו פונקציה בוליאנית בשם,Power המקבלת כפרמטרים: מספר x מטיפוס int ומספר y מטיפוס.int הפונקציה מחזירה כפרמטר פלט מטיפוס double את x. y בנוסף, הפונקציה מחזירה )לא כפרמטר פלט( ערך true אם הצליחה וערך false אם נכשלה )הפונקציה נכשלת אם בו- זמנית = 0 x ו-.)y 0 כתבו תוכנית הקוראת מספר שלם 0 x ומספר שלם נוסף y, ומדפיסה את!x ואת x y תוך שימוש בפונקציות מסעיפים א' ו- ב'. הוציאו הודעה מתאימה במקרה שפעולה נכשלת. שאלה 9: בשאלה זו מחלק אמיתי של מספר שלם חיובי n, הוא כל שלם חיובי שמחלק את n פרט ל- n עצמו. הגדרה: שני מספרים שלמים וחיוביים, B, A, נקראים ידידותיים, אם סכום המחלקים האמיתיים של A שווה ל- B, וסכום המחלקים האמיתיים של B שווה ל- A. מספר הוא מושלם אם הוא ידידותי עם עצמו. =+2+3.2=+2++7+ דוגמאות: המספרים ו 2 הם מושלמים: המספרים 2 ו- 22 ידידותיים כי סכום מחלקי 22 הוא 2: +2++5+++2+22++55+=2 וסכום מחלקי 2 הוא :22 +2++7+2=22 א. ב. ג. כתבו פונקציה שמקבלת כפרמטר מספר שלם חיובי n, ומחזירה כפרמטרי פלט את מספר המחלקים האמיתיים של המספר ואת סכומם. דוגמא: מחלקי 2 הם.,,3,2, לכן הפונקציה אמורה להחזיר, 5 )כלומר 5 מחלקים שסכומם הוא (. פתרון יעיל לסעיף זה מבצע כ- n איטרציות. הערה: ניתן להשתמש בפונקצית השורש )sqrt( בספריה. math.h כתבו פונקציה בוליאנית )כלומר פונקציה המחזירה true או )false המחליטה האם הפרמטר שלה הוא מספר מושלם. יש להשתמש לשם כתיבת פונקציה זו בפונקציה מסעיף א', ולא לשכפל את הקוד הנמצא שם. כתבו והריצו את התכנית הבאה המשתמשת בפונקציות מסעיפים א', ו- ב'. התכנית קולטת מספר M ומדפיסה:. את כל המספרים המושלמים בין 2 ל- M. 2. את כל הזוגות הידידותיים כך ששני בני הזוג הם בין 2 ל- M. הערה: אלגוריתם לא יעיל לתת-סעיף זה ירוץ בערך פי M יותר זמן מאלגוריתם יעיל. הערות:..2 הגדירו פונקציות עזר נוספות על פי הצורך. יש לספק דוגמאות הרצה לסעיף ג' בלבד, הדוגמאות צריכות לכלול פלט עבור הקלטים.M = 30,000 ו-,M = 3000,M = 300 37

רקורסיה: void printtriangle( int n); שאלה : כתבו פונקציה רקורסיבית: המקבלת מספר טבעי n ומדפיסה כוכביות בצורת משולש, שבבסיסו n כוכביות. * * * * * * * * * * * * * * * לדוגמא, עבור 5=n הפונקציה תדפיס: void printopositetriangles( int n); שאלה 2: כתבו פונקציה רקורסיבית: המקבלת מספר טבעי n ומדפיסה כוכביות בצורת שני משולשים הפוכים, שבסיסיהם בעלי n כוכביות. * * * * * * * * * * * * * * * * * * * * לדוגמא, עבור 4=n הפונקציה תדפיס: 3

שאלה 3: בשאלה זו נרצה לצייר סרגל במאונך. לצורך כך כתבו פונקציה רקורסיבית: void drawruler (int k); הפונקציה מקבלת פרמטר שלם חיובי k, על הפונקציה לצייר - k 2 סימוני שנתות )ע"י סימני '-'(, באופן הבא: באמצע )ב- ½ הסרגל( מציירים k שנתות. באמצע כל אחד מהחצאים שנוצרו )במקומות- ¼ ו- ¾ ) מציירים -k שנתות. במקומות,5/,3/,/ ו- 7/ מציירים k-2 שנתות..)2 k -/2 k,,3/2 k,/2 k וכך הלאה, עד לרמה שמציירים שנתה אחת )במקומות למשל עבור 4=k, האלגוריתם ידפיס את הסרגל )המספרים במסגרת לא יודפסו(: מיקום יחסי של השנתות על גבי הסרגל סרגל - /6= /6 - - 2/6= /8-3/6= 3/6 - - - 4/6= /4-5/6= 5/6 - - 6/6= 3/8-7/6= 7/6 - - - - 8/6= /2-9/6= 9/6 - - 0/6= 5/8 - /6= /6 - - - 2/6= 3/4-3/6= 3/6 - - 4/6= 7/8-5/6= 5/6 שאלה 4: כתבו פונקציה רקורסיבית בוליאנית המקבלת כפרמטר מספר טבעי, ובודקת אם ספרותיו מהוות סדרה יורדת ממש )משמאל לימין(. כלומר הפונקציה תחזיר את הערך true אם כן, ואת הערך false אם לא. 39

bool iseven(int num, int dig); שאלה 5: כתבו פונקציה רקורסיבית: המקבלת כקלט מספר טבעי num וספרה.dig על הפונקציה להחזיר true אם ורק אם מספר המופעים של הספרה dig ב- num הוא זוגי. למשל: 5) IsEven(9545, ואילו 4) IsEven(9545, הוא true הוא. false שאלה 6: ידוע כי כל מספר שלם חיובי בסיס ניתן גם להצגה בבסיס 2. כתבו פונקציה רקורסיבית: void printinbinary(int num); אשר מקבלת כקלט מספר חיובי, num ומדפיסה את ההצגה של num בבסיס 2. printinbinary(20); 000 למשל הפעלת הפונקציה: תגרום להדפסת: שאלה 7: נתונה הבעיה הבאה: ישנו סולם בן n שלבים שעליו ניתן לטפס בכל צעד או בקפיצה של שלב אחד, או בקפיצה של שני שלבים. כתבו פונקציה רקורסיבית: int numways(int n); שמחזירה את מספר הדרכים השונות שבהן ניתן לטפס על סולם בגודל n שלבים. לדוגמא: numways(4) תחזיר 5, מאחר ואפשר לטפס על סולם בן שלבים בחמשת הדרכים הבאות: --- --2-2- 2-- 2-2

שאלה 8: ידוע כי כל מספר שלם ניתן להצגה כמכפלה של מספרים ראשוניים. למשל: = 2*2*2 7 = 7 2 = 2 *2* 5 כתבו פונקציה רקורסיבית: void printprimefactors(int num); אשר מקבלת כקלט מספר,num 2, num ומדפיסה, את הגורמים הראשוניים של.num סדרת המספרים שתודפס צריכה להיות לא יורדת, ומכפלת המספרים שתודפס תהיה שווה ל- num. למשל הקריאה: printprimefactors(20) תגרום להדפסת: 2 2 5 שאלה 9: כתבו פונקציה רקורסיבית: void find2factor(int num, int& k, int& m); הפונקציה מקבלת כקלט מספר טבעי,num ומחזירה דרך פרמטרי הפלט k ו- m, ערכים המקיימים:, num 2 k m כאשר k 0 שלם, ו- m טבעי אי-זוגי. למשל:. 40 2 עבור,num=40 האלגוריתם יעדכן ב- k את הערך 3, וב- m את הערך 5, היות ש- 3 5 0 עבור,num=4 האלגוריתם יעדכן ב- k את הערך, וב- m את הערך, היות ש-. 4 2 4 הערה: לא ניתן להניח שהפרמטרים k ו- m, מגיעים מאותחלים בערכים כלשהם. שאלה : אחת הדרכים לבדוק אם מספר שלם מתחלק ב - היא לסכם את ספרות המספר תוך החלפת סימני הספרות לסירוגין. אם תוצאת הסיכום אינה חד-ספרתית, יש לחזור על התהליך עבור הערך המוחלט של התוצאה, וכך הלאה עד שהתוצאה היא חד ספרתית. אם התוצאה הסופית )כאשר נותרים עם ספרה אחת( היא אפס - המספר מתחלק ב -, אחרת המספר אינו מתחלק ב -. לדוגמה: המספר, 7723 אם נסכם את ספרותיו תוך החלפת סימנים לסירוגין, נקבל: =7-7+6-2+3-4+8 התוצאה אינה חד-ספרתית לכן יש לחזור על התהליך עבור הערך המוחלט של התוצאה. אחרי סיכום הספרות תוך החלפת סימנים לסירוגין נקבל: 0=-. התוצאה הינה חד ספרתית, וכן שווה ל-, ולכן המספר המקורי מתחלק ב-. שימו לב! ניתן גם לסכם את ספרות המספר החל מימין )במקום משמאל כמו שנעשה בדוגמה(. התוצאה תהיה זהה או הפוכה בסימן, אך הערך המוחלט יהיה זהה בשני המקרים. א. ב. כתבו פונקציה רקורסיבית, המקבלת כפרמטר מספר שלם אי שלילי ומסכמת את ספרותיו תוך החלפת סימני הספרות לסירוגין. כתבו פונקציה רקורסיבית נוספת, המקבלת כפרמטר מספר שלם אי שלילי ובודקת בדרך המתוארת לעיל אם הוא מתחלק ב. הפונקציה תשתמש בפונקציה מסעיף א'. הערה: אין להשתמש בלולאות ו/או במערכים לכתיבת הפונקציות הנדרשות.

הם מספרים שלמים אי-שליליים, נקרא לנקודות בעלות ו- y שאלה : בהינתן נקודה )x,y( במישור כאשר x הקואורדינטות השלמות במלבן שקודקודיו הם (0,x),(y,0) (x,y),,(0,0) "הרשת של."(x,y) למשל הרשת של (2,) כוללת את הנקודות (2,) (,), (0,), (2,0), (,0),.(0,0), כתבו פונקציה רקורסיבית המקבלת כפרמטרים את זוג קואורדינטות )x ו- y(, ומחזירה את מספר המסלולים השונים ברשת של (x,y) מהנקודה ),( לנקודה.)x,y( ההתקדמות במסלול, המותרת בכל שלב היא תזוזה של יחידה אחת ימינה או תזוזה של יחידה אחת למעלה. הערה: אין צורך לפרט את המסלולים. לדוגמא: אל הנקודה )2,( ישנם שלושה מסלולים שונים והם : (0,0) (0,) (,) (2,) (0,0) (,0) (2,0) (2,) (0,0) (,0) (,) (2,) 2

מערכים: void printarray(int a[],int size) int i; cout << ; for(i = 0 ; i < size ; ++i) cout << <<a[i] <<, ; cout << \n ; שאלה : נניח שמוגדרת הפונקציה הבאה: עבור כל אחד משני קטעי הקוד להלן, ענו על השאלות הבאות: א. האם הקוד עובר קומפילציה? ב. האם הקוד כתוב בסגנון תכנותי טוב? נמקו. ג. אם הקוד אכן ירוץ, מהו הפלט שמתקבל כתוצאה מהרצתו? הסבירו. הניחו שכל הקצאות הזיכרון מתבצעות בכתובות עוקבות בסדר עולה )למשל, אם מופיעה הכרזה ;b int,a אזי כתובות a ו- b עוקבות, וכתובת b גדולה מכתובת a(. a) void main() int j = 7; int a[4] =, 2, 3, 4 ; int k = 8; printarray(a,4); a[3] = j; printarray(a,4); a[-] = 98; a[4] = 0; printarray(a,4); cout << j = << j << \n ; cout << k = << k << \n ; printarray(a,5); printarray(a-,6); b) void main() int a[3][4] =, 2, 3, 4, 5, 6, 7, 8, 9; a[2][2] = 98; printarray(a[0],4); printarray(a[],4); printarray(a[2],4); printarray(a[0],2); a[2][-] = 88; printarray(a[0],4); printarray(a[],4); printarray(a[2],4); 3

שאלה 2: כתבו תוכנית הקולטת סדרה של 2 מספרים שלמים )לאו דווקא שונים זה מזה( לתוך מערך, ומדפיסה את האינדקסים של המספרים השווים למספר הקטן ביותר במערך )המינימום(. למשל בסדרה של 2 המספרים הבאים )הנקראת משמאל לימין( : 4 6 4 2 4 2 4 4 6 4 2 4 יש להדפיס 5 8 0 )כי הוא המינימלי והוא נמצא באינדקסים אלו(. שאלה 3: כתבו תוכנית הקולטת מספרים שלמים חיוביים לתוך מערך, סוף הקלט יסומן על ידי -. על התוכנית להדפיס את אינדקס של מספר אשר החל ממנו מתחילה סדרת מספרים יורדת חלש )בסדרה יורדת חלש כל מספר קטן או שווה לקודמו( שאורכה מקסימלי. הערה: ניתן להניח שלא יהיו יותר מ- 5 מספרים בקלט לפני שיופיע -. דוגמא: עבור הקלט )משמאל לימין(: 5 3 4 6 4 3 2 - יודפס כי החל מהאינדקס מתחילה הסדרה 6 4 3 2 שהיא סדרה יורדת חלש באורך ואין בדוגמה זו סדרה יורדת חלש שאורכה גדול מ-. שאלה 4: כתבו את הפונקציות הבאות: א. פונקציה שמקבלת בתור פרמטרים מערך של מספרים ממשיים ואת גודלו, ומחזירה את מספר הערכים הגדולים מ - במערך. ב. הערה: ג. ד. ה. בדומה לסעיף א' אלא שהפעם יש להחזיר את התוצאה כפרמטר פלט של הפונקציה )והפונקציה תהיה.)void יש להשתמש לשם כך בפונקציה מסעיף א' )ולא לשכפל קוד(. לסעיפים הבאים קיים אלגוריתם פשוט ויעיל שמזיז כל מספר במערך לכל היותר פעם אחת. פונקציה:( sizeb void copyodd (int A[], int sizea, int B[], int& שמקבלת בתור פרמטרים מערך A של מספרים וגודלו.sizeA על הפונקציה להחזיר במערך B את כל המספרים האי-זוגיים אשר נמצאים במערך A. כמו כן, ב- sizeb יוחזר מספר המספרים שהוכנסו למערך B. פונקציה: size) void removeodd (int A[], int& שמקבלת בתור פרמטרים מערך A של שלמים ואת גודלו,.size המערך A והפרמטר size הם פרמטרי קלט/פלט. בקלט, המערך A מכיל size שלמים כלשהם ובפלט הוא יכיל רק את המספרים הזוגיים שהיו בקלט, על-פי הסדר המקורי שהיה ביניהם. הפונקציה תחזיר בפרמטר,size את מספר המספרים הזוגיים ב- A )שהוא גודלו הלוגי החדש(. לא ניתן להשתמש במערך עזר. דוגמה: קריאה עם קלט A 5,2,7,4 ו- size 4 צריכה להחזיר. A 2, אין חשיבות לערכים A 3.size 2 ו- A 2,4 פונקציה : size) void splitparity(int A[], int שמקבלת בתור פרמטרים מערך A של מספרים ואת גודלו,.size על הפונקציה לשנות את סדר האיברים במערך כך שכל המספרים הזוגיים יופיעו ברצף בתחילת המערך וכל המספרים האי זוגיים יופיעו ברצף בסופו. פרט לכך, אין חשיבות לסדר בין המספרים.

שאלה 5 כתבו את הפונקציות הבאות: א. פונקציה: double MeanMatrix(double A[][SIZE],int num_rows, int num_cols) המקבלת מערך דו ממדי A, ומחזירה את הממוצע של כל איברי המערך )הדו-ממדי( A. הניחו כי SIZE הוא קבוע שהוגדר קודם וכן.num_cols => SIZE,num_rows => SIZE ב. פונקציה: void MeanDiagonal(double A[][SIZE],int dim, double& diag, double& diag2) ג. המקבלת מערך דו ממדי ריבועי, )מספר השורות הלוגי = מספר העמודות הלוגי =.)dim הפונקציה מחזירה ב- diag את ממוצע איברי האלכסון הראשי, וב- diag2 את ממוצע איברי האלכסון המשני. הניחו כי SIZE הוא קבוע שהוגדר קודם וכן ש-.dim => SIZE פונקציה: int positive(double A[][SIZE],int num_rows, int num_cols) המקבלת מערך דו-ממדי A. הפונקציה מחזירה את מספר המספרים ב- A הגדולים מ-. הגדירו פונקציות עזר כנדרש. הניחו כי SIZE הוא קבוע שהוגדר קודם וכן.num_cols => SIZE,num_rows => SIZE שאלה 6: כתבו תכנית שמקבלת מהמשתמש קלט המורכב מהתווים [,],,,(,) לבדוק האם הקלט מהווה סדרה חוקית של סוגריים. ומסתיים ב 'n\'.)enter( על התוכנית בסדרה חוקית של סוגריים לכל פתיחת סוגריים מסוג מסוים יש סגירת סוגריים מאותו סוג. כמו כן הסוגריים האחרונות שנפתחות צריכות להיות הראשונות להיסגר. )) (( חוקי () ([]) חוקי ([()]) חוקי ] [ ( לא חוקי אין סוגר ל ( הראשון. ) ( לא חוקי היה צריך לשים לפני (. ) ( ) ] ] [ ) ( ([ חוקי ( [] ( - לא חוקי הסגירה ל לא במקום הנכון. דוגמאות:..2.3..5..7 בדקו שהתכנית שלכם נותנת את התשובה הנכונה על דוגמאות, -7 בנוסף הריצו אותה על דוגמאות נוספות כיד דמיונכם הטובה עליכם. הערה: ניתן להניח שעומק הסוגריים בקלט הוא לכל היותר. 3 הכוונה בעומק הסוגריים הוא מספר המרבי של סוגריים שפתוח בכל נקודה בקלט. )לדוגמא: עבור ()[]()()([()]) העומק הוא (. 3 5

שאלה 7: א. כתבו את הפונקציות: ) int ispalindrome( char s[]); 2) void switchletters( char s[] ); 3) void removechar (char s[], char ch); 4) int strstr( char s[], char s2[] ); 5) int string2integer (char s[]); המבצעות את הדברים הבאים )עליכם לקרוא עד סוף השאלה לפני שתתחילו(: מודיעה אם המחרוזת s היא פלינדרום. כלומר, שהמחרוזת מתחילתה לסופה שווה למחרוזת מסופה לתחילתה. הופכת את הסדר של כל זוג תווים במקומות עוקבים, i,i+ במחרוזת s כאשר i אי-זוגי )לדוגמה, עבור המחרוזת abcdef יוחזר.)badcfe אם הסדרה באורך אי-זוגי, אז התו אחרון יישאר במקומו. מוחקת את כל מופעי התו ch מהמחרוזת s תוך כדי צמצום הרווחים שנוצרו. שימו לב להערה בסוף השאלה. מחפשת את המופע הראשון של המחרוזת s2 במחרוזת s ומחזירה את מיקומו או - אם s2 אינו מופיע ב- s. מקבלת מחרוזת המכילה ספרות ומחזירה את המספר השלם המיוצג במחרוזת. ) )2 )3 )4 )5 מה סדר גודל זמן הריצה של כל אחת מהפונקציות שכתבתם, כפונקציה של אורך המחרוזת הנתונה כפרמטר )ב- כפונקציה של אורכי שתי המחרוזות(. הערה: בכתיבת הפונקציות הנ"ל אין להשתמש בפונקציות הספרייה.string.h אם ברצונכם להשתמש בחלק מהן, ממשו אותן בעצמכם. ב. כתבו תכנית הקולטת שורות קלט )עד לקבלת שורה ריקה( לתוך מערך דו-ממדי של תווים, כך שכל שורה של המערך תכיל שורת קלט אחת בתור מחרוזת. אח"כ התוכנית תבצע:. תמחק משורת הקלט הראשונה את כל הרווחים שמופיעים בה. 2. תבדוק אם השורה השנייה היא פלינדרום, ותהפוך את סדר כל זוג תווים בה אם אינה פלינדרום. 3. תחשב את ערך המספר שבשורה השלישית )דאגו שאכן יהיו רק ספרות המרכיבות מספר שלם בשורה השלישית של קובץ הקלט(. 4. תמחק את כל השורות החל מהשורה הרביעית שהמילה "new" מופיעה בהן )דאגו שיהיו לפחות שתי שורות כאלו בקובץ הקלט(, ותצמצם את הרווחים שנוצרו כתוצאה ממחיקת השורות. אפשר להשתמש לשם כך ב-.strcpy שימו לב להערה בסוף השאלה. 5. תדפיס לסיום את הערך שחושב ב- 3, ואח"כ את כל המחרוזות החל באחרונה וכלה בראשונה, כל מחרוזת בשורה נפרדת. לצורך כתיבת התכנית, השתמשו )מלבד )strcpy אך ורק בפונקציות שכתבתם בסעיף א', ובפקודות קלט/פלט. הערה: ניתן להניח כי אורך כל שורה לא עולה על 25 תווים, וכן כי מספר השורות אינו עולה על.

י- k שאלה 8: כתבו תכנית המבצעת את הפעולות הבאות: קולטת 2 ציונים לתוך מערך. ממיינת את המערך בסדר עולה חלש לפי ציוני הסטודנטים. מדפיסה את הציונים שבמערך הממוין. k את קריאת הנתונים וכתיבת הפלט יש לבצע בעזרת פונקציות מתאימות. את המיון יש לבצע בעזרת פונקציה המיישמת את האלגוריתם הבא: אלגוריתם מיון הכנסה sort) (insertion בסדר עולה חלש עבור המערך x שגודלו הוא n: האלגוריתם משנה את מערך הקלט בתהליך בן n שלבים. נסמן את המערך בתום השלב ה- k ב- )k x k מתחיל מ- (. בתום השלב ה- k k, האיברים הראשונים במערך x k הם k האיברים הראשונים במערך המקורי x, ]x ]x,...,[0 אבל ממוינים בינם לבין עצמם בסדר עולה חלש. יתר n-k האיברים הם ללא שינוי כלומר ] k. x [ k] x[ k],..., x [ n ] x[ כלומר ] n [0]x )בשלב הראשון לא קרה כלום ולמעשה בתום השלב הראשון, החלק הממוין הוא בגודל ו- [0]x x(. זהה למערך הקלט x המערך [0]x. בתום השלב השני החלק בשלב השני, צריך להכניס את []x למקומו הנכון ביחס ל- [0]x x 2 [], x[0],x[] יהיה שווה לאחד מבין x 2 הממוין הוא בגודל 2 ומכיל את x[0],x[] בלבד. [0] יהיה שווה לערך השני ויתקיים []x2. ]x2 [0 יתר 2-n איברי מערך הקלט ישארו במקומם, כלומר. x 2] x[2],..., x [ n ] x[ n ] 2[ 2 בשלב ה- k,. x ] xk... xk [ למקומו הנכון בין k 2 x[ k ] יש להכניס את, k 2 לשם כך יש: א. למצוא את המקום הנכון של x[k] בחלק הממוין של המערך. ב. "לפנות" מקום ל-[ x[k ע"י הזזה של איברי המערך )אם צריך(. ג. להכניס את x[k] למקום הפנוי.. x [ k] x[ k],..., x [ n ] x[ יתר n-k איברי מערך הקלט ישארו במקומם, כלומר, [ n k 0 k k וכך הלאה עד תום השלב ה- n -י, בו החלק הממוין הוא בגודל n ומכיל את כל איברי המערך. זה יהיה מערך הפלט.,2,,8, x חמשת מערכי הביניים יראו כך: 4,2 x 2,,8, 4,2 x x x x 2 3 4 5,2,8, 4,2,2,8, 4,2 4,,2,8,2 4,,2,2,8 דוגמה: אם מערך הקלט הוא הערות: בתוכנית שתכתבו יש לקרוא ראשית את כל הציונים ורק אז להתחיל למיין את המערך שנקרא עפ"י האלגוריתם שתואר לעיל. על מנת לשמור על כלליות הפונקציה שמממשת את האלגוריתם, אין להשתמש במערכי עזר. מהו סדר גודל זמן הריצה )כפונקציה של n( של אלגוריתם המיון שתואר לעיל? נמקו את תשובותיכם. 7

שאלה 9: כתבו פונקציה יעילה ככל האפשר: int findchange(int arr[], int n); המקבלת כתובת התחלה של מערך המכיל מספרים שלמים -,arr ואת גודלו n. ידוע ש[ 0 ] arr הוא מספר זוגי וש [-n] arr הוא מספר אי-זוגי, וכן ידוע כי n 2 על הפונקציה להחזיר אינדקס כלשהו i המקיים: arr[i] זוגי ו- [+ i] arr הינו אי-זוגי. למשל עבור המערך: [3,2],4,8,7,5,4 הפונקציה יכולה להחזיר 2 )אשר בו יושב המספר ואחריו 7(, או 5 )אשר בו יושב המספר ואחריו 3(. הערה: יש לתת פתרון שזמן ריצתו הוא סדר גודל של.log(n) שאלה : סדרה נקראת סדרה עולה-יורדת אם איבריה עולים ממש עד שלב מסוים ואז מתחילים לרדת ממש. לדוגמא הסדרה 3 9 23 25 6 4 8 היא סדרה עולה-יורדת. כתבו פונקציה יעילה ככל שתוכלו: int getmaxincdecseq(int arr[],int n); המחשבת את האיבר המכסימלי במערך arr באורך n בהנחה שהוא מכיל סדרה עולה יורדת. מהו סדר גודל זמן הריצה של האלגוריתם שבו השתמשתם כפונקציה של n? נמקו. הערה: יש לתת פתרון שזמן ריצתו הוא יעיל ככל שתוכלו. שאלה : נניח שמוגדר הקבוע הגלובלי.const int N כתבו פונקציה יעילה ככל שתוכלו: void getupperleft(int mat[][n],int n, int& row, int& col); אשר מקבלת מטריצה ריבועית mat בגודל n על n, אשר מכילה רק אפסים )( ואחדים )(. נתון שהמטריצה mat מכילה מלבן ימני תחתון שכל אבריו הם ואילו יתר אברי המטריצה הם. גודל מלבן.. האחדים הוא לפחות על הפונקציה להחזיר, באמצעות הפרמטרים row ו-,col את השורה והעמודה של הפינה השמאלית העליונה במלבן האחדים. למשל, אם mat היא המטריצה הבאה: הקריאה getupperleft(mat,7,row,col) תעדכן את row להיות 3 ואת col להיות. הערה: יש לתת פתרון שזמן ריצתו הוא סדר גודל של.log(n)

שאלה 2: א. כתבו פונקציה רקורסיבית: void minmax(int A[], int left, int right, int &min, int &max); כאשר A היא כתובת התחלה של מערך של מספרים שלמים, ו- right left, מכילים אינדקסים חוקיים במערך A. על הפונקציה להחזיר בפרמטרים min, max את המספר הקטן ביותר ואת המספר הגדול ביותר בין האינדקסים left ל- right במערך A. הניחו.left => right ב. כתבו פונקציה רקורסיבית: bool checkdecseq(int A[], int left, int right); כאשר A היא כתובת התחלה של מערך של מספרים שלמים, ו- right left, מכילים אינדקסים חוקיים במערך A. הפונקציה Check תחזיר true אם איברי המערך, בין האינדקסים left ל- right מהווים סדרה יורדת, ותחזיר false אחרת. void reverse(char s[]); שאלה 3: א. כתבו פונקציה רקורסיבית: ההופכת את סדר התווים במחרוזת s. כתבו פונקציה רקורסיבית: void inttostr(unsigned int num, char s[]); המכניסה למערך s את מחרוזת התווים המייצגים את הערך העשרוני של השלם.num ב. הערה: מותר להשתמש לכתיבת הפונקציות בפונקציה strlen מ-.string.h שאלה 4: כתבו פונקציה רקורסיבית: bool havesameelems(int Arr[], int Arr2[], int size); המקבלת שני מערכים, ומספר המציין את הגודל המשותף של שני המערכים. הפונקציה תחזיר true אם"ם שני המערכים מכילים את אותם איברים באותן השכיחויות, אך לאו דווקא באותו הסדר. למשל: עבור 2] [, 2, 6, 5, = Arr עבור ] [, 2, 6, 5, = Arr ו- ] [2, 5, 6, 2, =,Arr2 הפונקציה תחזיר.true ו- ] [2, 5, 6, 2, =,Arr2 הפונקציה תחזיר.false שאלה 5: כתבו פונקציה רקורסיבית: bool subsetsum(int numbers[], int size, int sum); הפונקציה מקבלת מערך של מספרים, את גודלו, ומספר נוסף,.sum הפונקציה תחזיר true אם"ם קיימת איזושהי תת-קבוצה של מספרים מתוך המערך )לאו דווקא רצופה( שסכומה הוא.sum למשל, אם 0] [, 5, 3, 9, = numbers ו- = 4,sum הפונקציה תחזיר true היות ש-. 5 9 4 9

מצביעים: #include <iostream> using namespace std; שאלה : נתונה התוכנית הבאה: void main() int x = 0;//Assume x is in address 000 in the memory int y = 20; int arr[0] = 3,6,9,2,5,8,2,24,27,30; int* ptr; int* ptr2; הקוד החסר a) b) c) d) בכל אחד מן הסעיפים הבאים נתונה השלמה לקוד החסר. ענו על השאלות הבאות עבור כל אחד מן הסעיפים a עד k. א. האם התוכנית עוברת קומפילציה? אם לא, ציינו מדוע. ב. האם ישנה שגיאה לוגית בתוכנית )לדוגמא חריגת זיכרון, גלישה וכד'(? פרטו. ג. מהו הפלט של התוכנית? )יש להשיב על סעיף זה רק אם התוכנית עוברת קומפילציה( במקומות בהם הפלט אינו ידוע )ערך זבלי( ציינו זאת. הנחה: בלוק הזיכרון המוקצה לתוכנית מתחיל בכתובת, הקצאות הזיכרון מתבצעות ברצף כך שסדרת הכתובות עולה. הערה: הקבוע endl מייצג את התו 'n\'. cout << &y << endl; cout << &ptr << endl; cout << arr; ptr = &x; y = *ptr; cout << ptr << endl; cout << y << endl; cout << &y << endl; *ptr = x; y = *ptr; cout << y; ptr = &x; *ptr = y; cout << x; 5

e) f) g) h) i) ptr = &x; *ptr = &y; *ptr = *ptr2; cout << x; ptr = arr + 2; cout << *ptr; ptr = arr; x = *ptr + 2; y = *(ptr + 2); cout << x << endl; cout << y << endl; ptr = arr; arr = ptr; cout << arr[2]; ptr = arr + 2; cout << ptr[0]; ptr++; cout << ptr[0] << endl; cout << ptr[2] << endl; ptr = ptr 2; cout << *ptr << endl; j) k) ptr = arr + 2; ptr[2] = x; cout << arr[2] << endl; cout << arr[4] << endl; *(ptr + 2) = x; ptr + 2 = &x; cout << *(ptr + 2) << endl; cout << ptr + 2 << endl; a ו- b מצביעים. int x=5; int y=3; Swap(&x,&y); cout<<x<<y; שאלה 2: כתבו את הפונקציה: b) void swap(int* a, int* הפונקציה מקבלת שני מצביעים למספרים שלמים ומחליפה את תוכן התאים בזיכרון עליהם לדוגמא, קטע הקוד הבא יגרום להדפסת הספרה 3 ואחריה הספרה 5: 5